package urjc.as.emergencies.resources;

import org.restlet.Context;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.ResourceException;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;

import urjc.as.emergencies.data.BaseEntity;
import urjc.as.emergencies.data.Storage;

/**
 * Clase base para los RESTlets de la aplicación Webmail. Esta clase ofrece una
 * implementación uniforme del método GET junto con métodos comunes para el
 * acceso al repositorio de datos.
 * 
 * @author Sergio Saugar
 */
public class BaseResource extends Resource {

	// /////////////////// CONSTRUCTOR

	/**
	 * Constructor por defecto.
	 */
	public BaseResource(Context context, Request request, Response response) {
		super(context, request, response);

		// Variantes de representación soportadas
		getVariants().add(new Variant(MediaType.TEXT_XML));
	}

	// /////////////////// GET

	/**
	 * Tratamiento del método GET. Devuelve una representación de este recurso
	 * adecuada a la variante seleccionada. Este método es llamado por
	 * handleGet() después de realizar la negociación de la representación
	 * (variant).
	 */
	@Override
	public Representation represent(Variant variant) throws ResourceException {
 
		Representation rep = null;
		getStorage();
		Storage storage = Storage.getInstance();
		BaseEntity resource = storage.getEntity(getRequest().getResourceRef().toString());

		if (resource != null) {
			// Obtiene la representación XML de la entidad
			String stringRep = resource.serializar();

			// Genera una representación adecuada a la variante
			// seleccionada.
			if (variant.getMediaType().equals(MediaType.TEXT_XML)) {
				// Envia la representación XML directamente
				rep = new StringRepresentation(stringRep, MediaType.TEXT_XML);
			} else {
				// No es una de las representaciones que puedo ofrecer,
				// debió
				// existir un error en la negociación de contenido.
				throw new ResourceException(
						Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
			}
		} else {
			// El objeto no está en el almacenamiento
			throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND);
		}
		return rep;
	}

	// /////////////////// OTROS MÉTODOS

	/**
	 * Devuelve una referencia al almacenamiento compartido de la aplicación.
	 */
	protected Storage getStorage() {
		return Storage.getInstance();
	}

}
